package visual.texto;

import java.io.IOException;

import negocios.FacadeNegocios;
import negocios.Usuario;
import negocios.excecoes.EntradaInvalidaException;
import negocios.excecoes.LocalizacaoException;
import negocios.excecoes.NaoEncontradoException;

/**
 * Classe que implementa um Menu de entrada, para manipulacao do sistema. Esse
 * menu devera oferecer opcoes como logar, criar usuario, etc.
 * 
 * @author Jonathan Brilhante
 * @author Jose Rafael
 * @author Nata Venancio
 * @author Renato Almeida
 * 
 * @version 2.0
 */

public class MenuEntrada extends MenuTexto {
	private static final double VERSAO = 2;
	private static final int CRIAR = 1;
	private static final int ACESSAR = 2;
	private static final int SOBRE = 3;
	private static final int SUPORTE = 4;
	private static final int SAIR = 5;

	private static final String SAIDA = "Obrigado por usar o I'm Here" + SEP
			+ "O Sistema foi desativado.";
	private static final String ABERTURA = "########### I'm Here ###########";
	private static final String MENU_PRINCIPAL = "1 - Criar Nova Conta" + SEP
			+ "2 - Acessar Conta " + SEP + "3 - Sobre o I'm Here" + SEP
			+ "4 - Contato" + SEP + "5 - Sair" + SEP;
	private static final String SOBRE_NOS = "Versao "
			+ VERSAO
			+ SEP
			+ "I'm Here e um sistema que permite compartilhamento de localizacao de pessoas."
			+ SEP
			+ "Os usuarios so poderao visualizar a informacao de localizacao uns dos outros se assim desejarem."
			+ SEP
			+ "Para que isso seja possivel um convite de compartilhamento deve ser enviado a um usuario, o qual define se exibe ou oculta sua localizacao."
			+ SEP
			+ "Nesse cenario, os usuarios podem trocar mensagens entre si, seja um e-mail, um SMS ou ate conversar por chat."
			+ SEP;
	private static final String CADASTRO = "Cadastro de novo Usuario, preencha todos os campos necessarios com informacoes validas"
			+ SEP
			+ "A senha deve conter no minimo 6 caracteres e o email e telefone devem seguir o padrao:"
			+ SEP
			+ "Telefone Valido: 8333884924"
			+ SEP
			+ "Email Valido: exemplovalido@teste.com"
			+ SEP
			+ "(Campos Necessarios contem * na frente)" + SEP;
	private static final String CONTATO = "Contatos:" + SEP
			+ "natexcientista@gmail.com" + SEP + "rafaefarias@gmail.com" + SEP
			+ "renatoaf.ufcg@gmail.com" + SEP + "ridleyshadow@gmail.com" + SEP;

	/**
	 * Metodo auxiliar para logar um Usuario no sistema
	 * 
	 * @return o usuario logado, ou null, caso nao houver login
	 */
	private Usuario logarUsuario() {
		System.out.println("## Digite o Login e a Senha ##" + SEP);
		System.out.println("Login : ");
		String username = entrada.leLinha();
		System.out.println("Senha : ");
		String senha = entrada.leLinha();
		Usuario us = null;

		try {
			us = FacadeNegocios.getInstance().logar(username, senha);
		} catch (LocalizacaoException e) {
			System.err.println(e.getMessage());
			System.err
					.println("Sera necessario digitar manualmente seu endereco de IP.");
			String ip = entrada.leLinha();
			try {
				us = FacadeNegocios.getInstance().logar(username, senha, ip);
				return us;
			} catch (LocalizacaoException e1) {
				System.err.println(e.getMessage());
				System.err
						.println("Sera necessario digitar manualmente a sua latitude e longitude.");
				try {
					System.out.println("Latitude : ");
					double latitude = Double.parseDouble(entrada.leLinha());
					System.out.println("Longitude : ");
					double longitude = Double.parseDouble(entrada.leLinha());
					us = FacadeNegocios.getInstance().logar(username, senha,
							latitude, longitude);
					return us;
				} catch (Exception falha) {
					System.err.println(falha.getMessage());
					System.err.println("Impossivel de efetuar o login" + SEP);
				}
			} catch (IOException e1) {
				System.err.println(e1.getMessage());
				System.err.println("Impossivel de efetuar o login" + SEP);
			} catch (NaoEncontradoException e1) {
				System.err.println(e1.getMessage());
				System.err.println("Impossivel de efetuar o login" + SEP);
			}
		} catch (Exception error) {
			System.err.println(error.getMessage());
			System.err.println("Impossivel de efetuar o login" + SEP);
		}
		return us;
	}

	private void cadastro() {
		System.out.println(CADASTRO);
		System.out.println("UserName(*) : ");
		String username = entrada.leLinha();
		System.out.println("Senha(*) : ");
		String senha = entrada.leLinha();
		System.out.println("Nome(*) : ");
		String nome = entrada.leLinha();
		System.out.println("Email(*) : ");
		String email = entrada.leLinha();
		System.out.println("Telefone(*): ");
		String tel = entrada.leLinha();

		try {
			FacadeNegocios.getInstance().criarUsuario(username, nome, email,
					senha, tel);
			System.out
					.println("Cadastro efetuado com sucesso, bem vindo ao I'm Here, "
							+ nome + "." + SEP);
		} catch (EntradaInvalidaException e) {
			System.err.println(e.getMessage());
			System.err.println("Cadastro incompleto." + SEP);
		}
	}

	public void executa() {
		System.out.println(ABERTURA);
		System.out.println("Digite o numero referente a operacao desejada :"
				+ SEP);

		boolean controle = true;

		while (controle) {
			System.out.print(MENU_PRINCIPAL);

			int escolha = getEntradaValida(CRIAR, SAIR);
			if (escolha == INVALIDA) {
				continue;
			}

			switch (escolha) {
			case CRIAR:
				cadastro();
				break;

			case ACESSAR:
				Usuario logIn = logarUsuario();
				if (logIn != null)
					new MenuUsuario(logIn.getLogin()).executa();
				break;

			case SOBRE:
				System.out.println(SOBRE_NOS);
				System.out.println("Pressione Enter para voltar ao Menu" + SEP);
				entrada.leLinha();
				break;

			case SUPORTE:
				System.out.println(CONTATO);
				break;

			case SAIR:
				controle = false;
				FacadeNegocios.getInstance().sair();
				System.out.println(SAIDA);
				break;
			}
		}
	}
}